//=============================================================================
/**
 *
 *	@file		encount_effect_maiko.c
 *	@brief		エンカウントエフェクト(まいこはん）
 *	@author		hosaka genya
 *	@data		2009.02.25	オンメモリが足りないので encount_effect_sub から切り出し
 *
 */
//=============================================================================
#include "common.h"
#include "system/lib_pack.h"
#include "system/brightness.h"
#include "fieldsys.h"
#include "fieldmap_work.h"
#include "field_event.h"
#include "fld_motion_bl.h"
#include "encount_effect_def.h"
#include "system/wipe.h"
#include "system/laster.h"
#include "system/fontproc.h"
#include "field_encounteffect.naix"
#include "savedata/mystatus.h"
#include "include/battle/trtype_def.h"
#include "include/battle/trno_def.h"
#include "include/msgdata/msg.naix"

#include "field/fieldmap.h"

#include "encount_effect_maiko.h"

#define	__ECNT_TOMO_H_GLOBAL


//-----------------------------------------------------------------------------
/**
 *					コーディング規約
 *		●関数名
 *				１文字目は大文字それ以降は小文字にする
 *		●変数名
 *				・変数共通
 *						constには c_ を付ける
 *						staticには s_ を付ける
 *						ポインタには p_ を付ける
 *						全て合わさると csp_ となる
 *				・グローバル変数
 *						１文字目は大文字
 *				・関数内変数
 *						小文字と”＿”と数字を使用する 関数の引数もこれと同じ
*/
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
/**
 *
 *		まいこはん	エンカウント [ MAIKO ]
 *
 */
//-----------------------------------------------------------------------------

//-------------------------------------
///		障子が閉じるエンカウント
//=====================================
typedef struct{
	ENC_ADDMOVE_WORK_FX		move_x;			// 障子のX座標
	u32						cnt;			// 障子が閉まっている時間
	BOOL					bg_move;
} ENCOUNT_TEST_SHOJI;
#define ENCOUNT_SHOJI_CLOSE_SYNC	(18)				//障子の閉じるのにかかるシンク
#define ENCOUNT_SHOJI_START_ADD		(FX32_CONST(5))		//初速
#define ENCOUNT_SHOJI_START_X		(FX32_CONST(128))	//開始座標X
#define ENCOUNT_SHOJI_END_X			(FX32_CONST(0))		//終了座標X
#define ENCOUNT_SHOJI_Y				(0)					//障子の座標Y
#define ENCOUNT_SHOJI_CLOSE_WAIT	(5)				//しまっている時間


//----------------------------------------------------------------------------
/**
 *	@brief	障子が閉じるようなエフェクト
 *
 *	@param	tcb
 *	@param	* work
 *
 *	@return
 */
//-----------------------------------------------------------------------------
void EncountEffect_Test_Shoji(TCB_PTR tcb, void * work )
{
	//	シーケンス
	enum _SEQ {
		SEQ_INIT,
		SEQ_FLASH_INIT,
		SEQ_FLASH_MAIN,
		SEQ_SHOJI_CLOSE_INIT,
		SEQ_SHOJI_CLOSE_MAIN,
		SEQ_SHOJI_CLOSE_EXIT,
		SEQ_SHOJI_OPEN_INIT,
		SEQ_SHOJI_OPEN_MAIN,
		SEQ_EXIT,
	};

	ENCOUNT_EFFECT_WORK		*eew	= work;
	ENCOUNT_TEST_SHOJI		*tw		= eew->work;
	BOOL					result;

	switch( eew->seq ){
	//	初期化
	case SEQ_INIT:
		eew->work = sys_AllocMemory( HEAPID_FIELD, sizeof(ENCOUNT_TEST_SHOJI) );
		memset( eew->work, 0, sizeof(ENCOUNT_TEST_SHOJI) );
		tw	= eew->work;

		//
		// BG非表示のまま GF_BGL_BGControlSet を行なう(display.cでexternされている内部変数をダマす)
		//
		// ▼前提
		//
		//		・GF_Disp_GX_VisibleControl は内部変数で現在のディスプ状況を保持しており、
		//		　変更が行なわれない場合は return を返すように出来ている。
		//
		//		・GS環境下では GF_BGL_BGControlSet 内部で GF_Disp_GX_VisibleControl により 強制的にDISPがONになってしまう。
		//
		// ▼問題点
		//		エンカウントエフェクトでは暗転が入らない状態でBGControlをセットする必要があるので、DISPがONされると画面がパシってしまうことがある。
		//		(BTS2747,BTS2804などの原因)
		//
		// ▼処理内容
		//
		//		1. GF_Disp_GX_VisibleControl で GF_BGL_BGControlSet を行ないたい対象BGのディスプをONにする。
		//
		//		2. GX_SetVisiblePlane で直接ディスプレジスタを操作する。これにより、GF_Disp_GX_VisibleControl では 1でセットしたBGを操作できなくなる。
		//
		//		3. GF_BGL_BGControlSet を行なう。このとき、内部のGF_Disp_GX_VisibleControl でDISPがONになるのを防ぐことが出来る。
		//
		//		3. GF_Disp_GX_VisibleControlDirect で内部変数、レジスタを上書きしなおしてロックを解除する。
		//
		// これでパシり問題解決！ by hosaka genya
		//
		GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG1, VISIBLE_ON );
		GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG3, VISIBLE_ON );
		GX_SetVisiblePlane( GX_PLANEMASK_BG0 | GX_PLANEMASK_BG2 | GX_PLANEMASK_OBJ );

		{
			// MAIN DISP（エフェクト１）
			static const GF_BGL_BGCNT_HEADER TextBgCntDat1 = {
				0, 0, 0x1000, 0, GF_BGL_SCRSIZ_512x256, GX_BG_COLORMODE_16,
				GX_BG_SCRBASE_0x0000, GX_BG_CHARBASE_0x04000, GX_BG_EXTPLTT_01,
				0, 0, 0, FALSE
			};
			GF_BGL_BGControlExit( eew->fsw->bgl, GF_BGL_FRAME1_M );
			GF_BGL_BGControlSet( eew->fsw->bgl, GF_BGL_FRAME1_M, &TextBgCntDat1, GF_BGL_MODE_TEXT );
			GF_BGL_ScrClear( eew->fsw->bgl, GF_BGL_FRAME1_M );
		}
		{
			// MAIN DISP（エフェクト１）
			static const GF_BGL_BGCNT_HEADER TextBgCntDat2 = {
				0, 0, 0x1000, 0, GF_BGL_SCRSIZ_512x256, GX_BG_COLORMODE_16,
				GX_BG_SCRBASE_0x1000, GX_BG_CHARBASE_0x08000, GX_BG_EXTPLTT_23,
				0, 0, 0, FALSE
			};
			GF_BGL_BGControlExit( eew->fsw->bgl, GF_BGL_FRAME3_M );
			GF_BGL_BGControlSet( eew->fsw->bgl, GF_BGL_FRAME3_M, &TextBgCntDat2, GF_BGL_MODE_TEXT );
			GF_BGL_ScrClear( eew->fsw->bgl, GF_BGL_FRAME3_M );
		}

		//	BG設定
		ENC_BG_SetNormalBGShoji(
				eew->p_handle,
				NARC_field_encounteffect_shoji_NSCR,
				NARC_field_encounteffect_shoji_NCGR,
				NARC_field_encounteffect_shoji_NCLR,
				0,
				0, eew->fsw->bgl, GF_BGL_FRAME1_M, GF_BGL_FRAME3_M );

		GF_BGL_PrioritySet( GX_PLANEMASK_BG1, 0 );
		GF_BGL_PrioritySet( GX_PLANEMASK_BG3, 0 );

		GF_BGL_BackGroundColorSet( GF_BGL_FRAME1_M, 0 );


		GF_BGL_ScrollSet( eew->fsw->bgl, GF_BGL_FRAME1_M, GF_BGL_SCROLL_X_SET, ENCOUNT_SHOJI_START_X>>FX32_SHIFT );
		GF_BGL_ScrollSet( eew->fsw->bgl, GF_BGL_FRAME3_M, GF_BGL_SCROLL_X_SET, 384-(ENCOUNT_SHOJI_START_X>>FX32_SHIFT) );

		// ダマし解除
		GF_Disp_GX_VisibleControlDirect( GX_PLANEMASK_BG0 | GX_PLANEMASK_BG2 | GX_PLANEMASK_OBJ );

//		GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG1, VISIBLE_OFF );
//		GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG3, VISIBLE_OFF );

		eew->seq	= SEQ_FLASH_INIT;
		break;

	//	フラッシュ初期化
	case SEQ_FLASH_INIT:
		EncountFlashTask(MASK_MAIN_DISPLAY, -16, -16,  &eew->wait, 2);
		eew->seq	= SEQ_FLASH_MAIN;
		break;

	//	フラッシュ処理
	case SEQ_FLASH_MAIN:
		if( eew->wait ){
			eew->seq	= SEQ_SHOJI_CLOSE_INIT;
		}
		break;

	//	障子閉じ初期化
	case SEQ_SHOJI_CLOSE_INIT:
		ENC_AddMoveReqFx( &tw->move_x, ENCOUNT_SHOJI_START_X, ENCOUNT_SHOJI_END_X, ENCOUNT_SHOJI_START_ADD, ENCOUNT_SHOJI_CLOSE_SYNC );
		GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG1, VISIBLE_ON );
		GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG3, VISIBLE_ON );
		tw->bg_move	= TRUE;
		eew->seq	= SEQ_SHOJI_CLOSE_MAIN;
		break;

	//	障子閉じ処理
	case SEQ_SHOJI_CLOSE_MAIN:
		if( ENC_AddMoveMainFx( &tw->move_x ) ){
			eew->seq	= SEQ_SHOJI_CLOSE_EXIT;
		}
		break;

	//	障子閉じ状態
	case SEQ_SHOJI_CLOSE_EXIT:
		GF_BGL_ScrollSet( eew->fsw->bgl, GF_BGL_FRAME1_M, GF_BGL_SCROLL_X_SET, ENCOUNT_SHOJI_END_X>>FX32_SHIFT );
		GF_BGL_ScrollSet( eew->fsw->bgl, GF_BGL_FRAME3_M, GF_BGL_SCROLL_X_SET, 384-(ENCOUNT_SHOJI_END_X>>FX32_SHIFT) );
		tw->bg_move	= FALSE;
		if( tw->cnt ++ > ENCOUNT_SHOJI_CLOSE_WAIT ) {
			GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG0, VISIBLE_OFF );
			tw->bg_move	= TRUE;
			tw->cnt	= 0;
			eew->seq	= SEQ_SHOJI_OPEN_INIT;
		}
		break;

	//	障子開く初期化
	case SEQ_SHOJI_OPEN_INIT:
		ENC_AddMoveReqFx( &tw->move_x, ENCOUNT_SHOJI_END_X, ENCOUNT_SHOJI_START_X, ENCOUNT_SHOJI_START_ADD, ENCOUNT_SHOJI_CLOSE_SYNC );
		tw->bg_move	= TRUE;
		eew->seq	= SEQ_SHOJI_OPEN_MAIN;
		break;

	//	障子開く処理
	case SEQ_SHOJI_OPEN_MAIN:
		if( ENC_AddMoveMainFx( &tw->move_x ) ){
			eew->seq	= SEQ_EXIT;
		}
		break;

	//	終了処理
	case SEQ_EXIT:
		tw->bg_move	= FALSE;
		WIPE_SetBrightnessFadeOut( WIPE_FADE_BLACK );

		if(eew->end != NULL){
			*(eew->end) = TRUE;		// タスク終了を報告
		}

		ENC_End( eew, tcb );
		return ;
	}


	if( tw->bg_move ) {
		GF_BGL_ScrollReq( eew->fsw->bgl, GF_BGL_FRAME1_M, GF_BGL_SCROLL_X_SET, tw->move_x.x>>FX32_SHIFT );
		GF_BGL_ScrollReq( eew->fsw->bgl, GF_BGL_FRAME1_M, GF_BGL_SCROLL_Y_SET, ENCOUNT_SHOJI_Y );

		GF_BGL_ScrollReq( eew->fsw->bgl, GF_BGL_FRAME3_M, GF_BGL_SCROLL_X_SET, 384-(tw->move_x.x>>FX32_SHIFT) );
		GF_BGL_ScrollReq( eew->fsw->bgl, GF_BGL_FRAME3_M, GF_BGL_SCROLL_Y_SET, ENCOUNT_SHOJI_Y );
	}
}
